package cn.catsdad.base.processor;

import cn.catsdad.base.entity.BaseEntity;
import cn.catsdad.base.page.PageBean;
import cn.catsdad.base.page.PageParam;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * base service暴漏的前后操作
 *
 * @author xuyl
 * @version 1.0 2024/7/13
 */
public interface IBaseServiceProcessor<T extends BaseEntity, ID extends Serializable> {

    /**
     * 获取处理器排序值，处理器会按照排序值正序执行
     *
     * @return 排序值
     */
    int getOrder();

    /**
     * 保存前
     *
     * @param entities 保存前实体
     */
    void preSave(Collection<T> entities);

    /**
     * 拆入前
     *
     * @param entities 插入前实体
     */
    void preInsert(Collection<T> entities);

    /**
     * 更新前
     *
     * @param entities 更新前实体
     */
    void preUpdate(Collection<T> entities);

    /**
     * 删除前
     *
     * @param ids 删除的id
     */
    void preDelete(Collection<ID> ids);

    /**
     * 删除前
     *
     * @param entities 删除的实体
     */
    void preEntityDeleted(Collection<T> entities);

    /**
     * 查询前
     *
     * @param ids 查询前id
     */
    List<T> preQuery(Collection<ID> ids, Class<T> clazz);

    /**
     * 分页查询前
     *
     * @param pageBean  分页对象
     * @param pageParam 分页查询参数
     */
    void prePageQuery(PageBean<T> pageBean, PageParam pageParam);

    /**
     * 保存后
     *
     * @param entities 保存后实体
     */
    void postSave(Collection<T> entities);

    /**
     * 插入后
     *
     * @param entities 插入后实体
     */
    void postInsert(Collection<T> entities);

    /**
     * 更新后
     *
     * @param entities 更新后实体
     */
    void postUpdate(Collection<T> entities);

    /**
     * 删除后
     *
     * @param keys 删除后id
     */
    void postDelete(Collection<ID> keys, Class<T> clazz);

    /**
     * 删除后
     *
     * @param entities 删除的实体
     */
    void postEntityDelete(Collection<T> entities);

    /**
     * 查询后
     *
     * @param entities 查询结果
     */
    void postQuery(Collection<T> entities);

    /**
     * 分页查询后
     *
     * @param pageBean  分页对象
     * @param pageParam 分页查询参数
     */
    void postPageQuery(PageBean<T> pageBean, PageParam pageParam);


}
